实现模块注入的方法有哪几种
实现模块注入的方法有以下几种:
使用CreateRemoteThread和LoadLibrary注入:即跨进程创建线程。注入程序先把DLL文件路径写入目标进程,再获取装载DLL的LoadLibray函数地址,最后调用CreateRemoteThread在目标进程中建立以LoadLibrary函数地址为线程函数地址、以DLL文件名为参数的远程线程。CreateRemoteThread调用内核函数NtCreateThread建立线程,而NtCreateThread函数的执行引起LoadLibrary的函数调用,用于加载进程用到的动态链接库NoJ。
使用APC注入:APC异步过程调用机制是Windows系统的一种“软件中断”机制。在进程中每个线程都有自己的APC队列,系统调用可以把一个“用户APC请求”挂入目标线程的APC队列,当线程从“软件中断”中恢复前,会对“用户APC请求”进行处理。注入程序也先把DLL文件路径写入目标进程,再将QueueUserAPC函数通过调用LoadLibrary插入DLL到目标线程的APC队列中。APC机制借用目标进程中的线程执行RootKit代码,因而避免了跨进程创建线程的常规方案,从而能有效的逃避针对跨进程创建线程的可疑行为的检测。且该技术未对内核对象等系统敏感信息进行修改,因而更具隐蔽性。
使用系统钩子注入:钩子是Windows消息处理机制的一部分。根据钩子函数所在的位置分为系统钩子和线程钩子。系统钩子要把钩子函数插入到其他进程的地址空间,需要将钩子函数代码写在模块DLL中,系统钩子可以监视整个系统内的钩子消息。注入程序通过SotWindowsHookEx函数设置系统钩子。当一个应用接收到某个消息时,Windows系统首先检查该消息类型的钩子是否存在,如果在则检查相应的钩子函数模块是否存在于当前进程的地址空间中,如不在则系统会调用LoadLibrary加载钩子函数模块。
使用注册表注入:在Windows NT/2000/2003操作系统中,Applnit.DLLs位于注册表中的HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\目录下,表示当某个进程加载User32.d11时,键值列出的所有DLL都将调用LoadLibrary函数加载到该进程空间中。AppInit.DLLs本质上是一种系统全局性的挂钩,攻击者只要把DLL添加到该键值下就实现了模块注入。
预防SQL注入的措施有以下这些:
严格区分用户权限:在权限设计中,针对软件用户,没有必要给予数据库的创建、删除等管理权限。这样即便在用户输入的SQL语句种含有内嵌式的恶意程序,因为其权限的限定,也不可能执行。所以程序在权限设计时,最好把管理员与用户区别起来。这样能够最大限度的降低注入式攻击对数据库产生的损害。
强制参数化语句:在设计数据库时,如果用户输入的数据并不直接内嵌到SQL语句中,而通过参数来进行传输的话,那麼就可以合理的预防SQL注入式攻击。运用这种方法能够避免绝大多数的SQL注入攻击。遗憾的是,如今适用参数化语句的数据库引擎并不多,但是数据库工程师在开发时要尽可能选用参数化设计语句。
检验用户输入的信息:在SQL Server数据库中,有比较多的输入內容检验工具,能够协助管理人员来应对SQL注入式攻击。